package co.gov.medellin.sdep.sisdep.model.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.List;

import javax.faces.context.FacesContext;
import javax.sql.DataSource;

import org.springframework.jdbc.core.SqlParameter;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.jdbc.object.MappingSqlQuery;
import org.springframework.jdbc.object.SqlUpdate;

import co.gov.medellin.sdep.sisdep.domain.gestion.VisitaAdministrativaController;
import co.gov.medellin.sdep.sisdep.model.ArticulosConsumidos;
import co.gov.medellin.sdep.sisdep.model.VisitaAdministrativa;

public class VisitaAdministrativaDAOImpl extends JdbcDaoSupport implements IVisitaAdministrativaDAO {

	private InsertOperation insertOperation;

    private UpdateOperation updateOperation;

    private DeleteOperation deleteOperation;

    private DeleteByPrimaryKey deleteByPrimaryKey;

    private FindByPrimaryKeyQuery findByPrimaryKeyQuery;

    private FindByCriteriaQuery findByCriteriaQuery;

    private FindAllQuery findAllQuery;

    private FindByRadicado findByRadicado;
   
    private FindByActiveStateQuery findByActiveStateQuery;

	private static final String SELECT = "SELECT * FROM GES_VISITA_ADM_T ";
	private static final String WHERE = " WHERE ";
	private static final String PARAMETER = " ?, ";

    public void delete(VisitaAdministrativa visitaAdministrativa) {
		deleteOperation.execute( visitaAdministrativa  );
	}

	public void deleteByPrimaryKey(long id) {
		deleteByPrimaryKey.execute(id);
	}

	public VisitaAdministrativa findByPrimaryKey(long login) {
		return findByPrimaryKeyQuery.runQuery(login);
	}

	public void insert(VisitaAdministrativa visitaAdministrativa) {
		insertOperation.execute( visitaAdministrativa );
	}

	public void update(VisitaAdministrativa visitaAdministrativa) {
		updateOperation.execute( visitaAdministrativa );
	}

	public VisitaAdministrativa findByCriteria(VisitaAdministrativa  visitaAdministrativa) {
		return findByCriteriaQuery.runQuery(visitaAdministrativa);
	}

	public List load() {
		return findAllQuery.runQuery();
	}
	
	public List loadByRadicado(VisitaAdministrativa visitaAdministrativa) {
		return findByRadicado.runQuery(visitaAdministrativa);
	}

	public VisitaAdministrativa findByActiveState(VisitaAdministrativa  visitaAdministrativa) {
		return findByActiveStateQuery.runQuery(visitaAdministrativa);
	}

	public void initDao() {
    	insertOperation   = new InsertOperation( getDataSource() );
    	updateOperation = new UpdateOperation(  getDataSource() );
    	//deleteOperation = new DeleteOperation(  getDataSource() );
    	//deleteByPrimaryKey = new DeleteByPrimaryKey( getDataSource());
    	findByPrimaryKeyQuery   = new FindByPrimaryKeyQuery(  getDataSource() );
    	findByCriteriaQuery = new FindByCriteriaQuery(  getDataSource() );
    	findAllQuery = new FindAllQuery( getDataSource() );
    	findByRadicado = new FindByRadicado (getDataSource());
    	//findByActiveStateQuery = new FindByActiveStateQuery( getDataSource() );
    }

    // ------------- SaveOperation ---------------------------------------
	class InsertOperation extends SqlUpdate	{
		private static final String sql = "INSERT INTO GES_VISITA_ADM_T ("
				  + " ID, "
				  + " ID_SOLICITUD, "
				  + " FECHA_VISITA, "
				  + " HORA_VISITA, "
				  + " ID_TIPO_VISITA, "
				  + " DIRECCION_VISITA, "
				  + " OBSERVACIONES, "				  
				  + " ID_TIPOLOGIA, "
				  + " ID_AMOBLAMIENTO, "
				  + " ID_TIPO_VENTA, "
				  + " TIENE_RECOMENDACIONES, "				  
				  + " TIENE_HOJA_DE_VIDA, "
				  + " ESE_DIGITAL, "
				  + " REGULADO, "
				  + " HORARIO, "
				  + " NRO_MODULO, "
				  + " NUMERO_CONTRATO, "
				  + " NUMERO_ACTA_ENTREGA, "
				  + " METROS_CUADRADOS_MTMTO, "
				  + " FECHA_VENCIMIENTO, "
				  + " ESTADO,"
				  + " USUARIO_CREA, "
				  + " FECHA_CREA "				  
				  + ") VALUES ("
			  	  + " GES_VISITA_ADM_SEC.nextVal, "
				  + PARAMETER
				  + PARAMETER
				  + PARAMETER
				  + PARAMETER
				  + PARAMETER
				  + PARAMETER
				  + PARAMETER
				  + PARAMETER
				  + PARAMETER
				  + PARAMETER
				  + PARAMETER
				  + PARAMETER
				  + PARAMETER
				  + PARAMETER
				  + PARAMETER
				  + PARAMETER
				  + PARAMETER
				  + PARAMETER
				  + PARAMETER
				  + PARAMETER
				  + PARAMETER
				  + "SYSDATE"
				  + ")";
		public  InsertOperation(DataSource ds) {
			super(ds,sql);
			//set here required parameters			
			declareParameter( new SqlParameter(Types.INTEGER));
			declareParameter( new SqlParameter(Types.DATE));
			declareParameter( new SqlParameter(Types.CHAR));
			declareParameter( new SqlParameter(Types.INTEGER));			
			declareParameter( new SqlParameter(Types.CHAR));
			declareParameter( new SqlParameter(Types.CHAR));			
			declareParameter( new SqlParameter(Types.INTEGER));
			declareParameter( new SqlParameter(Types.INTEGER));
			declareParameter( new SqlParameter(Types.INTEGER));
			declareParameter( new SqlParameter(Types.CHAR));
			declareParameter( new SqlParameter(Types.CHAR));
			declareParameter( new SqlParameter(Types.CHAR));
			declareParameter( new SqlParameter(Types.CHAR));
			declareParameter( new SqlParameter(Types.CHAR));
			declareParameter( new SqlParameter(Types.CHAR));
			declareParameter( new SqlParameter(Types.CHAR));
			declareParameter( new SqlParameter(Types.CHAR));
			declareParameter( new SqlParameter(Types.INTEGER));
			declareParameter( new SqlParameter(Types.DATE));
			declareParameter( new SqlParameter(Types.CHAR));
			declareParameter( new SqlParameter(Types.CHAR));
			compile();
		}
		public void execute(VisitaAdministrativa visitaAdministrativa) {
			InsertOperation.this.update( new Object[]{				
				visitaAdministrativa.getIdSolicitud(),
				visitaAdministrativa.getFechaVisita(),
				visitaAdministrativa.getHoraVisita(),
				visitaAdministrativa.getIdTipoVisita(),
				visitaAdministrativa.getDireccionVisita(),
				visitaAdministrativa.getObservaciones(),				
				visitaAdministrativa.getIdTipologia(),
				visitaAdministrativa.getIdAmoblamiento(),
				visitaAdministrativa.getIdTipoVenta(),
				visitaAdministrativa.getTieneRecomendaciones(),				
				visitaAdministrativa.getTieneHojaDeVida(),
				visitaAdministrativa.getEseDigital(),
				visitaAdministrativa.getRegulado(),
				visitaAdministrativa.getHorario(),
				visitaAdministrativa.getNroModulo(),
				visitaAdministrativa.getContratoHacienda(),
				visitaAdministrativa.getActaEntrega(),
				visitaAdministrativa.getMetrosCuadradosMantenimiento(),
				visitaAdministrativa.getFechaVencimiento(),				
				visitaAdministrativa.getEstado(),
				visitaAdministrativa.getUsuarioCrea()				
				});
		}
    }

    // ------------- UpdateOperation -------------------------------------
    class UpdateOperation extends SqlUpdate	{
    	private static final String sql = "UPDATE GES_VISITA_ADM_T SET "					  
					  + " ID_SOLICITUD = ? ,"
					  + " FECHA_VISITA = ? ,"
					  + " HORA_VISITA = ? ,"
					  + " ID_TIPO_VISITA = ? ,"
					  + " DIRECCION_VISITA = ? ,"
					  + " OBSERVACIONES = ? ,"					  
					  + " ID_TIPOLOGIA = ? ,"
					  + " ID_AMOBLAMIENTO = ? ,"
					  + " ID_TIPO_VENTA = ? ,"
					  + " TIENE_RECOMENDACIONES = ? ,"					  
					  + " TIENE_HOJA_DE_VIDA = ? ,"
					  + " ESE_DIGITAL = ? ,"
					  + " REGULADO = ? ,"
					  + " HORARIO = ? ,"
					  + " NRO_MODULO = ? ,"
					  + " NUMERO_CONTRATO = ? ,"
					  + " NUMERO_ACTA_ENTREGA = ? ,"
					  + " METROS_CUADRADOS_MTMTO = ? ,"
					  + " FECHA_VENCIMIENTO = ? ,"
					  + " ESTADO = ?,"
					  + " USUARIO_MODIFICA = ? ,"
					  + " FECHA_MODIFICA = SYSDATE "
				  	  + WHERE 
				  	  + " ID = ? ";
		public  UpdateOperation(DataSource ds) {
			super(ds,sql);
			//set here required parameters			
			declareParameter( new SqlParameter(Types.INTEGER));
			declareParameter( new SqlParameter(Types.DATE));
			declareParameter( new SqlParameter(Types.CHAR));			
			declareParameter( new SqlParameter(Types.INTEGER));
			declareParameter( new SqlParameter(Types.CHAR));
			declareParameter( new SqlParameter(Types.CHAR));			
			declareParameter( new SqlParameter(Types.INTEGER));
			declareParameter( new SqlParameter(Types.INTEGER));
			declareParameter( new SqlParameter(Types.INTEGER));
			declareParameter( new SqlParameter(Types.CHAR));
			declareParameter( new SqlParameter(Types.CHAR));
			declareParameter( new SqlParameter(Types.CHAR));
			declareParameter( new SqlParameter(Types.CHAR));
			declareParameter( new SqlParameter(Types.CHAR));
			declareParameter( new SqlParameter(Types.CHAR));
			declareParameter( new SqlParameter(Types.CHAR));
			declareParameter( new SqlParameter(Types.CHAR));
			declareParameter( new SqlParameter(Types.INTEGER));
			declareParameter( new SqlParameter(Types.DATE));			
			declareParameter( new SqlParameter(Types.CHAR));
			declareParameter( new SqlParameter(Types.CHAR));
			declareParameter( new SqlParameter(Types.INTEGER));
			compile();
		}
		public void execute(VisitaAdministrativa visitaAdministrativa) {
			UpdateOperation.this.update( new Object[]{				
				visitaAdministrativa.getIdSolicitud(),
				visitaAdministrativa.getFechaVisita(),
				visitaAdministrativa.getHoraVisita(),
				visitaAdministrativa.getIdTipoVisita(),
				visitaAdministrativa.getDireccionVisita(),
				visitaAdministrativa.getObservaciones(),				
				visitaAdministrativa.getIdTipologia(),
				visitaAdministrativa.getIdAmoblamiento(),
				visitaAdministrativa.getIdTipoVenta(),
				visitaAdministrativa.getTieneRecomendaciones(),
				visitaAdministrativa.getTieneHojaDeVida(),
				visitaAdministrativa.getEseDigital(),
				visitaAdministrativa.getRegulado(),
				visitaAdministrativa.getHorario(),
				visitaAdministrativa.getNroModulo(),
				visitaAdministrativa.getContratoHacienda(),
				visitaAdministrativa.getActaEntrega(),
				visitaAdministrativa.getMetrosCuadradosMantenimiento(),
				visitaAdministrativa.getFechaVencimiento(),				
				visitaAdministrativa.getEstado(),
				visitaAdministrativa.getUsuarioModifica(),				
				visitaAdministrativa.getId()
				});
		}
    }

    // ------------- DeleteOperation -------------------------------------
    class DeleteOperation extends SqlUpdate	{
		private static final String sql = "DELETE FROM GES_VISITA_ADM_T "
										+ WHERE
			  	  	  					+ " ID = ? ";
		public DeleteOperation(DataSource ds) {
			super(ds,sql);
			declareParameter( new SqlParameter(Types.CHAR) );
			compile();
		}
		public void execute(VisitaAdministrativa visitaAdministrativa) {
			this.update( new Object[]{
				visitaAdministrativa.getId()
			});
		}
	}

    // ------------- DeleteByPrimaryKey ----------------------------------
    class DeleteByPrimaryKey extends SqlUpdate	{
		private static final String sql = "DELETE FROM GES_VISITA_ADM_T "
										+ WHERE +"1=1";
		public DeleteByPrimaryKey(DataSource ds) {
			super(ds,sql);
			compile();
		}	
		public void execute(long id) {
			this.update( new Object[]{
			});
		}	
    }

    // ---- BaseQueryOperation for Mapping ResultSet values --------------
	abstract class BaseQueryOperation extends MappingSqlQuery {
		public BaseQueryOperation(DataSource ds,String sql) {
	   		super(ds,sql);
		}	
		protected Object mapRow(ResultSet rs, int rownum) throws SQLException {
			VisitaAdministrativa visitaAdministrativa = new VisitaAdministrativa();
				visitaAdministrativa.setId(new Long(rs.getLong("ID")));
				visitaAdministrativa.setIdSolicitud(new Long(rs.getLong("ID_SOLICITUD")));
				visitaAdministrativa.setFechaVisita(rs.getDate("FECHA_VISITA"));		
				visitaAdministrativa.setHoraVisita(rs.getString("HORA_VISITA"));
				visitaAdministrativa.setIdTipoVisita(new Long(rs.getLong("ID_TIPO_VISITA")));
				visitaAdministrativa.setIdTipoVisitaStr(rs.getString("ID_TIPO_VISITA"));
				visitaAdministrativa.setDireccionVisita(rs.getString("DIRECCION_VISITA"));
				visitaAdministrativa.setObservaciones(rs.getString("OBSERVACIONES"));
				visitaAdministrativa.setTieneRecomendaciones(rs.getString("TIENE_RECOMENDACIONES"));
				visitaAdministrativa.setIdTipologia(new Long(rs.getLong("ID_TIPOLOGIA")));
				visitaAdministrativa.setIdTipologiaStr(rs.getString("ID_TIPOLOGIA"));
				visitaAdministrativa.setTieneHojaDeVida(rs.getString("TIENE_HOJA_DE_VIDA"));
				visitaAdministrativa.setEseDigital(rs.getString("ESE_DIGITAL"));
				visitaAdministrativa.setRegulado(rs.getString("REGULADO"));
				visitaAdministrativa.setHorario(rs.getString("HORARIO"));
				visitaAdministrativa.setNroModulo(rs.getString("NRO_MODULO"));
				visitaAdministrativa.setContratoHacienda(rs.getString("NUMERO_CONTRATO"));
				visitaAdministrativa.setActaEntrega(rs.getString("NUMERO_ACTA_ENTREGA"));
				visitaAdministrativa.setMetrosCuadradosMantenimiento(new Long(rs.getLong("METROS_CUADRADOS_MTMTO")));
				visitaAdministrativa.setMetrosCuadradosMantenimientoStr(rs.getString("METROS_CUADRADOS_MTMTO"));
				visitaAdministrativa.setFechaVencimiento(rs.getDate("FECHA_VENCIMIENTO"));		
				visitaAdministrativa.setEstado(rs.getString("ESTADO"));
				visitaAdministrativa.setUsuarioCrea(rs.getString("USUARIO_CREA"));
				visitaAdministrativa.setFechaCrea(rs.getDate("FECHA_CREA"));		
				visitaAdministrativa.setUsuarioModifica(rs.getString("USUARIO_MODIFICA"));
				visitaAdministrativa.setFechaModifica(rs.getDate("FECHA_MODIFICA"));	
				
				if(visitaAdministrativa.getIdTipoVisita().intValue()==309){
					VisitaAdministrativaController va; 
					FacesContext context = FacesContext.getCurrentInstance();
					va = (VisitaAdministrativaController) context.getExternalContext().getSessionMap().get("visitaAdministrativaController"); 
					va.aCC.searchArticulosConsumidosByKey(va.articulosConsumidosService);
					if(va.aCC.articulosConsumidosListModel.getRowCount()>0){
						va.aCC.articulosConsumidos = (ArticulosConsumidos) ((List) va.aCC.articulosConsumidosListModel
								.getWrappedData()).get(Integer.parseInt("0"));
						visitaAdministrativa.setIdElemento(va.aCC.articulosConsumidos.getId());
						visitaAdministrativa.setIdArticulo(va.aCC.articulosConsumidos.getIdArticulo());
						visitaAdministrativa.setCantidad(va.aCC.articulosConsumidos.getCantidad());
						visitaAdministrativa.setDetalle(va.aCC.articulosConsumidos.getDetalle());
						visitaAdministrativa.setIdElementoStr(va.aCC.articulosConsumidos.getId().toString());
						visitaAdministrativa.setIdArticuloStr(va.aCC.articulosConsumidos.getIdArticulo().toString());
						visitaAdministrativa.setCantidadStr(va.aCC.articulosConsumidos.getCantidad().toString());						
					}
					if(va.aCC.articulosConsumidosListModel.getRowCount()>1){
						va.aCC.articulosConsumidos = (ArticulosConsumidos) ((List) va.aCC.articulosConsumidosListModel
								.getWrappedData()).get(Integer.parseInt("1"));
						visitaAdministrativa.setIdElemento1(va.aCC.articulosConsumidos.getId());
						visitaAdministrativa.setIdArticulo1(va.aCC.articulosConsumidos.getIdArticulo());
						visitaAdministrativa.setCantidad1(va.aCC.articulosConsumidos.getCantidad());
						visitaAdministrativa.setIdElemento1Str(va.aCC.articulosConsumidos.getId().toString());
						visitaAdministrativa.setIdArticulo1Str(va.aCC.articulosConsumidos.getIdArticulo().toString());
						visitaAdministrativa.setCantidad1Str(va.aCC.articulosConsumidos.getCantidad().toString());
						visitaAdministrativa.setDetalle1(va.aCC.articulosConsumidos.getDetalle());
					}
					if(va.aCC.articulosConsumidosListModel.getRowCount()>2){
						va.aCC.articulosConsumidos = (ArticulosConsumidos) ((List) va.aCC.articulosConsumidosListModel
								.getWrappedData()).get(Integer.parseInt("2"));
						visitaAdministrativa.setIdElemento2(va.aCC.articulosConsumidos.getId());
						visitaAdministrativa.setIdArticulo2(va.aCC.articulosConsumidos.getIdArticulo());
						visitaAdministrativa.setCantidad2(va.aCC.articulosConsumidos.getCantidad());
						visitaAdministrativa.setIdElemento2Str(va.aCC.articulosConsumidos.getId().toString());
						visitaAdministrativa.setIdArticulo2Str(va.aCC.articulosConsumidos.getIdArticulo().toString());
						visitaAdministrativa.setCantidad2Str(va.aCC.articulosConsumidos.getCantidad().toString());
						visitaAdministrativa.setDetalle2(va.aCC.articulosConsumidos.getDetalle());
					}					
					if(va.aCC.articulosConsumidosListModel.getRowCount()>3){
						va.aCC.articulosConsumidos = (ArticulosConsumidos) ((List) va.aCC.articulosConsumidosListModel
								.getWrappedData()).get(Integer.parseInt("3"));
						visitaAdministrativa.setIdElemento3(va.aCC.articulosConsumidos.getId());
						visitaAdministrativa.setIdArticulo3(va.aCC.articulosConsumidos.getIdArticulo());
						visitaAdministrativa.setCantidad3(va.aCC.articulosConsumidos.getCantidad());
						visitaAdministrativa.setIdElemento3Str(va.aCC.articulosConsumidos.getId().toString());
						visitaAdministrativa.setIdArticulo3Str(va.aCC.articulosConsumidos.getIdArticulo().toString());
						visitaAdministrativa.setCantidad3Str(va.aCC.articulosConsumidos.getCantidad().toString());
						visitaAdministrativa.setDetalle3(va.aCC.articulosConsumidos.getDetalle());
					}					
					if(va.aCC.articulosConsumidosListModel.getRowCount()>4){
						va.aCC.articulosConsumidos = (ArticulosConsumidos) ((List) va.aCC.articulosConsumidosListModel
								.getWrappedData()).get(Integer.parseInt("4"));
						visitaAdministrativa.setIdElemento4(va.aCC.articulosConsumidos.getId());
						visitaAdministrativa.setIdArticulo4(va.aCC.articulosConsumidos.getIdArticulo());
						visitaAdministrativa.setCantidad4(va.aCC.articulosConsumidos.getCantidad());
						visitaAdministrativa.setIdElemento4Str(va.aCC.articulosConsumidos.getId().toString());
						visitaAdministrativa.setIdArticulo4Str(va.aCC.articulosConsumidos.getIdArticulo().toString());
						visitaAdministrativa.setCantidad4Str(va.aCC.articulosConsumidos.getCantidad().toString());
						visitaAdministrativa.setDetalle4(va.aCC.articulosConsumidos.getDetalle());
					}					
				}
				
				if(visitaAdministrativa.getTieneRecomendaciones() !=null && visitaAdministrativa.getTieneRecomendaciones().equals("S"))
					visitaAdministrativa.setTieneRecomendacionesChk(true);
				if(visitaAdministrativa.getTieneHojaDeVida() !=null && visitaAdministrativa.getTieneHojaDeVida().equals("S"))
					visitaAdministrativa.setTieneHojaDeVidaChk(true);				
				if(visitaAdministrativa.getEseDigital() !=null && visitaAdministrativa.getEseDigital().equals("S"))
					visitaAdministrativa.setEseDigitalChk(true);
				if(visitaAdministrativa.getRegulado() !=null && visitaAdministrativa.getRegulado().equals("S"))
					visitaAdministrativa.setReguladoChk(true);
				
				
			return visitaAdministrativa;
		}
    }

    // ------------- FindByPrimaryKeyQuery -------------------------------
    class FindByPrimaryKeyQuery extends BaseQueryOperation {
		private static final String sql = SELECT
										+ WHERE + "1=1";
    	public FindByPrimaryKeyQuery(DataSource ds) {
    		super(ds,sql);
			compile();
    	}
    	public VisitaAdministrativa runQuery(long id) {
			List result =  execute( new Object[]{new Long(id)});
			if ( result.size() > 0 ) {
        		return (VisitaAdministrativa) result.get(0);
        	} else {
        		return null;
        	}
    	}
    }

    // ------------- FindByCriteriaQuery ---------------------------------    
    class FindByCriteriaQuery extends BaseQueryOperation {
		private static final String sql = SELECT
										+ WHERE + " 1=1 "
			  	  	  					+ " AND ID_SOLICITUD = ? ";
										
    	public FindByCriteriaQuery(DataSource ds) {
    		super(ds,sql);
			declareParameter( new SqlParameter(Types.INTEGER) );
			compile();
    	}
    	public VisitaAdministrativa runQuery(VisitaAdministrativa visitaAdministrativa) {
			List result =  execute( new Object[]{
					visitaAdministrativa.getIdSolicitud()
				});
			if ( result.size() > 0 ) {
        		return (VisitaAdministrativa) result.get(0);
        	} else {
        		return null;
        	}
    	}
    }

    // ------------- FindAllQuery ----------------------------------------    
    class FindAllQuery extends BaseQueryOperation {
		private static final String sql = SELECT
										+ WHERE + " 1=1 ";
    	public FindAllQuery(DataSource ds) {
    		super(ds,sql);
			compile();
    	}
    	public List runQuery() {
			List result =  execute();
			if ( result.size() > 0 ) {
        		return  result;
        	} else {
        		return null;
        	}
    	}
    }
    
    // ------------- FindByRadicado ----------------------------------------    
    class FindByRadicado extends BaseQueryOperation {
		private static final String sql = SELECT 
					+ WHERE  + "ID_SOLICITUD IN "
					+ "(SELECT ID FROM  ADM_SOLICITUD_T WHERE RADICADO LIKE ? )";
    	public FindByRadicado(DataSource ds) {
    		super(ds,sql);
    		declareParameter( new SqlParameter(Types.CHAR) );
			compile();
    	}
    	public List runQuery(VisitaAdministrativa visitaAdministrativa) {
			List result =  execute( new Object[]{
						visitaAdministrativa.getRadicado()
			});
			if ( result.size() > 0 ) {
        		return  result;
        	} else {
        		return null;
        	}
    	}
    }

    // ------------- FindByActiveStateQuery  -----------------------------
    class FindByActiveStateQuery extends BaseQueryOperation {
		private static final String sql = SELECT
										+ WHERE + "1=1";
    	public FindByActiveStateQuery(DataSource ds) {
    		super(ds,sql);
			compile();
    	}
    	public VisitaAdministrativa runQuery(VisitaAdministrativa visitaAdministrativa) {
			List result =  execute( new Object[]{
			});
			if ( result.size() > 0 ) {
        		return (VisitaAdministrativa) result.get(0);
        	} else {
        		return null;
        	}
    	}
    }

}
